/**
 * {作业名称}
 *
 * 输入参数:
 *
 * 输出参数:
 *
 */
(() => {
  // 私有区域
  function findNode(node, nodeID, index = 0) {
    if (node.ID === nodeID) return [node, index];
    for (const next of node.next) {
      const [foundNode, foundIndex] = findNode(next.node, nodeID, index + 1);
      if (foundNode) return [foundNode, foundIndex];
    }
    return [];
  }

  function eachNode(node, callback, index = 0) {
    callback(node, index);
    for (const next of node.next) {
      eachNode(next.node, callback, index + 1);
    }
  }

  return function ({ UID, InstanceID, ApproveNode, FollowNodeID }) {
    // 验证输入参数
    if (!UID) throw Error("无效会话");
    if (!InstanceID) throw Error("缺失流程实例参数");
    if (!FollowNodeID) throw Error("缺失定位节点参数");

    // 根据实例获取流程定义
    const instance = A.card['B.流程实例'].load(InstanceID);
    if (!instance) throw Error('流程实例不存在');
    const workflow = A.job['B.Flow_LoadDefinition']({ UID, WorkflowID: instance.流程定义.ID });

    // 找到定位节点
    const [followNode, followNodeIndex] = findNode(workflow.start, FollowNodeID);
    if (!followNode) throw Error('定位节点不存在');

    const { node: oldNextNode } = followNode.next[0];

    // 获取原来的路径记录
    const { Rows: oldPaths } = A.job.CardR(UID, 'B.流程路径', null, [['流程定义', '=', instance.流程定义.ID], ['入口节点', '=', FollowNodeID]]);

    // 创建新节点和新路径
    const newNextNode = {
      ID: A.guid(),
      名称: '审批节点-' + (followNodeIndex + 1),
      状态描述: '待审批',
      类型: 3,
      坐标X: 200,
      坐标Y: oldNextNode.坐标Y,
      宽度: 100,
      高度: 40,
      流程定义: instance.流程定义.ID,
      待办用户脚本: ApproveNode.待办用户 ? `() => ${JSON.stringify(ApproveNode.待办用户)}` : null,
      ...ApproveNode,
    };
    const newPaths = [{
      流程定义: instance.流程定义.ID,
      入口节点: followNode.ID,
      出口节点: newNextNode.ID,
      入口锚点: 2,
      出口锚点: 0,
    }, {
      流程定义: instance.流程定义.ID,
      入口节点: newNextNode.ID,
      出口节点: oldNextNode.ID,
      入口锚点: 2,
      出口锚点: 0,
    }]

    // 原来的后续节点, 后延一个位置坐标
    const updateNodes = [newNextNode];
    eachNode(oldNextNode, (node, index) => {
      node.名称 = node.类型 === 2 ? '结束' : '审批节点-' + (followNodeIndex + 2 + index);
      node.坐标Y += 100;
      updateNodes.push(node);
    });

    A.job.CardDW({
      D: [{
        Card: 'B.流程路径',
        Model: null,
        Records: oldPaths,
      }],
      W: [{
        Card: 'B.流程节点',
        Model: null,
        Records: updateNodes,
      }, {
        Card: 'B.流程路径',
        Model: null,
        Records: newPaths,
      }], UID,
    });

    // 返回结果
    return true;
  };
})()